<<<<<<< HEAD
#include "uart.h"
=======
>>>>>>> eb31325907d20d5a534302285990ef0fe18a1039
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
<<<<<<< HEAD
=======
#include "uart.h"
// 串口的初始化
>>>>>>> eb31325907d20d5a534302285990ef0fe18a1039
int init_serial(const char *file, int baudrate)
{
    int fd;

    fd = open(file, O_RDWR);
    if (fd == -1)
    {
        perror("open device error:");
        return -1;
    }

    struct termios myserial;
    // 清空结构体
    memset(&myserial, 0, sizeof(myserial));
    // O_RDWR
    myserial.c_cflag |= (CLOCAL | CREAD);
    // 设置控制模式状态，本地连接，接受使能
    // 设置 数据位
    myserial.c_cflag &= ~CSIZE;   // 清空数据位
    myserial.c_cflag &= ~CRTSCTS; // 无硬件流控制
    myserial.c_cflag |= CS8;      // 数据位:8

    myserial.c_cflag &= ~CSTOPB; //   //1位停止位
    myserial.c_cflag &= ~PARENB; // 不要校验
    // myserial.c_iflag |= IGNPAR;   //不要校验
    // myserial.c_oflag = 0;  //输入模式
    // myserial.c_lflag = 0;  //不激活终端模式

    switch (baudrate)
    {
    case 9600:
        cfsetospeed(&myserial, B9600); // 设置波特率
        cfsetispeed(&myserial, B9600);
        break;
    case 115200:
        cfsetospeed(&myserial, B115200); // 设置波特率
        cfsetispeed(&myserial, B115200);
        break;
    case 19200:
        cfsetospeed(&myserial, B19200); // 设置波特率
        cfsetispeed(&myserial, B19200);
        break;
    }

    /* 刷新输出队列,清除正接受的数据 */
    tcflush(fd, TCIFLUSH);

    /* 改变配置 */
    tcsetattr(fd, TCSANOW, &myserial);

    return fd;
}
<<<<<<< HEAD
void parse_buf(unsigned char buf[15])
{
    
    if (buf[2] == 0x15)
    {
        double Lux=(buf[4]<<24)|(buf[5]<<16)|(buf[6]<<8)|buf[7];
        Lux /=100.0;
        printf("光照强度：%.2f\n",Lux);
    }
    else if (buf[2] == 0x45)
    {
        double T =( buf[4]<<8|buf[5])/100.0;
        double P=((buf[6]<<24)|((buf[7]<<16)|(buf[8]<<8)|buf[9]))/100.0;
        double Hum =( buf[10]<<8|buf[11])/100.0;
        double H =( buf[12]<<8|buf[13])/100.0;
        printf("温度：%.2f摄氏度 气压：%.2fPa 湿度：%.2f%% 海拔：%.2fm\n",T,P,Hum,H);
    }
}
int get_gy39(int op)
=======

int get_gy39()
>>>>>>> eb31325907d20d5a534302285990ef0fe18a1039
{
    // 1.打开串口并初始化
    int fd = init_serial(COM2, 9600);
    if (fd == -1)
    {
<<<<<<< HEAD
        perror("串口初始化错误！\n");
    }

    // 2.发送指令
    if(op==1)
    {
        unsigned char cmd= {0xA5,0x51,0xF6};
        write(fd, cmd, sizeof(cmd));
    }
    else if(op==2)
    {
        unsigned char cmd= {0xA5,0x52,0xF7};
        write(fd, cmd, sizeof(cmd));
    }
    unsigned char buf[15] = {0};
    unsigned char ch;
    while (1)
    {
        // 3.接收数据
        do
        {
            read(fd, &ch, 1);
        } while (ch != 0x5A);
        read(fd, &ch, 1);
        if (ch != 0x5A)
            continue;
        read(fd, &buf[2], 1);
        read(fd, &buf[3], 1);
        for (int i = 0; i < buf[3]; i++)
        {
            read(fd, &buf[i + 4], 1);
        }
        read(fd, &buf[buf[1] + 4], 1);
        // 4.解析数据，并显示
        parse_buf(buf);
        //break;
=======
        perror("init_serial");
        return;
    }

    // 2.发送指令
    unsigned char cmd[3] = {0xA5, 0x81, 0x26};
    write(fd, cmd, sizeof(cmd));

    unsigned char buf[15] = {0};
    while (1)
    {
        // 3.接收数据
        read(fd, buf, sizeof(buf));
        for (int i = 0; i < 15; i++)
        {
            printf("%d ", buf[i]);
        }
        puts("");
        double lux = buf[4] << 24 | buf[5] << 16 | buf[6] << 8 | buf[7];
        // 4.解析数据，并显示
        lux /= 100.0;
        printf("lux=%f\n", lux);
>>>>>>> eb31325907d20d5a534302285990ef0fe18a1039
        // 根据手册解析buf数组里面的数据
    }
    close(fd);
    // 5.关闭串口
<<<<<<< HEAD
}
=======
}
>>>>>>> eb31325907d20d5a534302285990ef0fe18a1039
